package example.字符串;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * https://www.cnblogs.com/lulipro/p/7450886.html
 * <p>
 * 假定给定一个只 包含 加、减、乘、除，和括号的算术表达式，
 * 你怎么编写程序计算出其结果？
 * <p>
 * 逆波兰算法的核心步骤就2个：
 * 1、将中缀表达式转换为后缀表达式，例如输入的原始表达式是 3*（5+7） ，7 5 3  + *  //
 * 2、根据后缀表达式，按照特定的计算规则得到最终计算结果
 */
// NC137 表达式求值
public class Demo2 {

    // 请写一个整数计算器，支持加减乘三种运算和括号。
    // 3 * ( 5 + 7/9 )
    public static int solve(String s) {
        //数值
        Stack<Integer> stack1 = new Stack<>();
        //运算符
        Stack<Character> queue = new Stack<>();
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '-' || chars[i] == '*' || chars[i] == '+') {
                queue.push(chars[i]);
            } else if (chars[i] >= '0' && chars[i] <= '9') {
                boolean flag = true;
                int sum = 0;
                int j;
                for (j = i; j < chars.length; j++) {
                    if (chars[j] >= '0' && chars[j] <= '9') {
                        sum = sum * 10 + Character.getNumericValue(chars[j]);
                    } else {
                        i = j - 1;
                        stack1.push(sum);
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    stack1.push(sum);
                    i = j - 1;
                }
            }

        }
        int size = stack1.size();
        int sum = stack1.pop();
        while (!stack1.isEmpty()) {
            Character character = queue.pop();
            if (character == '*') {
                sum = sum * stack1.pop();
            } else if (character == '-') {
                sum = sum - stack1.pop();
            } else if (character == '+') {
                sum = sum + stack1.pop();
            }
        }
        return sum;
    }

    //3 4 5 2 3  - + * +
    //3-2=1 ; 1+5=6 ; 6*4=24 ; 24+3
    public static void main(String[] args) {
        System.out.println(solve("6+(5+5)*51"));

    }
}
